package com.jbob.application;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;

import sparqlclient.SparqlClient;
import sparqlclient.SparqlClientHelper;

import com.jbob.collection.Balise;
import com.jbob.collection.Precision;
import com.jbob.collection.Qrel;
import com.jbob.collection.QueriesXml;
import com.jbob.collection.Query;
import com.jbob.constants.CONSTANTS;
import com.jbob.mysql.MySQLHelper;
import com.jbob.parser.ParserHelper;
import com.jbob.tools.Calculator;

/**
 * Classe MAIN du projet en charge de l'ex�cution en elle-m�me
 * @author lucas.bouabdelli jean-baptiste.guy
 */
public class WebSementiqueProject 
{
	public static void main(String[] args) 
	{
		long begin = System.currentTimeMillis();
		ParserHelper.parseFolder("./files");
		
		MySQLHelper.indexationBdd();
		
		Calculator.calculPoids();
		searchQueries();
		
		// Calcul temps
		long end = System.currentTimeMillis();
		float time = ((float) (end-begin)) / 1000f;

		System.out.println(" -- Traitement terminée --");
		System.out.println(" -- " + time + " sec. totale d'executions -- ");
	}
	
	public static void searchQueries(){
		ArrayList<Precision> aPrecision = new ArrayList<>();
		QueriesXml qXml = ParserHelper.parseRequest(new File("./files/queries.xml"));
		
		
		
		for (Query q : qXml.getQueries()) {
			System.out.println(" _____________________ ");
			System.out.println(q.getmText());
			
			System.out.println("Requete de départ : ");
			for(String text: q.getWordsToSeek()){
				System.out.println(" - " + text);
			}
			
			// Module SparQL
			SparqlClientHelper.reformulationTerms(q);
			q.stemAllContents();
			
			System.out.println("-- Requete : " + q.getmId() + "--");
			HashMap<Integer, Balise> listBalises = MySQLHelper.getItemsWithQuery(q);
			ArrayList<Balise> balises = new ArrayList<Balise>();
			
			for (Balise b : listBalises.values()) 
			{
				b.setPertinence(Calculator.calculCosinus(b, q));
				balises.add(b);
			}
			Collections.sort(balises);
			
			System.out.println("Résultats les plus pertinents : ");
			for (int i = 0; i < 5 ; i++) {
				System.out.println(balises.get(i));
				System.out.println(balises.get(i).getDoc());
				System.out.println(balises.get(i).getPath());
				System.out.println(balises.get(i).getPertinence());
			}
			
			
			// Récupérer les balises les plus pertinente du fichier qrels
			ArrayList<Qrel> aQrel = null;
			try {
				aQrel = ParserHelper.parseQueryResultFile(new File("./files/qrel" + q.getmId() + ".txt"));
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			int nb_balises_pertinentes = aQrel.size();
//			if (q.getmId().equals("05")) {
//				System.out.println(q.getSynonymsToSeek());
//				System.out.println(q.getSubClassToSeek());
//				System.out.println(q.getParentsToSeek());
//				System.out.println(aQrel);
//				System.out.println(aQrel.size());
//				System.exit(0);
//			}
				
			
			// Calcul du rappel et de la precision
			// Rappel = (Nb de doc pertinents selectionnée) / (nb total doc pertinents) => Qrels
			// Précision = (nb total de documents selectionné) / (nb total doc pertinents)
			
			boolean[] bRes = new boolean[CONSTANTS.RECHERCHE_NB_DOC_PERT_SELECT_MAX];
			for (int i = 0; i < CONSTANTS.RECHERCHE_NB_DOC_PERT_SELECT_MAX; i++) {
				
				for (Qrel qRel : aQrel) {
					if (balises.get(i).getPath().equals(qRel.getPath())
							&& balises.get(i).getDoc().equals(qRel.getDocName())) {
						bRes[i] = true;
						break;
					}
				}
				//TODO Vraiment utile ????
				if (!bRes[i]){
					bRes[i] = false;
				}
			}
			
			for (int i : CONSTANTS.RECHERCHE_ARRAY_PRECISION) {
				System.out.println("Précision à " + i);
				float cmptPrecision = 0;
				for (int j = 0; j < i; j++) {
					if (bRes[j]) {
						cmptPrecision++;
					}
				}
				float prec = (cmptPrecision / i * 100);
				aPrecision.add(new Precision(q.getmId(), i, prec));
				System.out.println((int)(cmptPrecision / i * 100) + " %");
			}
		}

		float sommePrec5 = 0;
		float sommePrec10 = 0;
		float sommePrec25 = 0;
		int nbPrec5 = 0;
		int nbPrec10 = 0;
		int nbPrec25 = 0;
		for (Precision precision : aPrecision) {
			if (precision.getLimite() == 5) {
				sommePrec5 += precision.getPrecision();
				nbPrec5++;
			} else if (precision.getLimite() == 10) {
				sommePrec10 += precision.getPrecision();
				nbPrec10++;
			} else if (precision.getLimite() == 25) {
				sommePrec25 += precision.getPrecision();
				nbPrec25++;
			}
		}
		System.out.println(" -- RESULTATS --");
		System.out.println("Moyenne 5 => " + Math.round(sommePrec5 / nbPrec5) + " %");
		System.out.println("Moyenne 10 => " + Math.round(sommePrec10 / nbPrec10) + " %");
		System.out.println("Moyenne 25 => " + Math.round(sommePrec25 / nbPrec25) + " %");
	}
}
